package br.com.sguc.manegedBean;

import java.io.IOException;
import java.io.Serializable;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import br.com.sguc.entidade.Campeonato;
import br.com.sguc.entidade.Equipe;
import br.com.sguc.entidade.Localizacao;
import br.com.sguc.entidade.Modalidade;
import br.com.sguc.entidade.Partida;
import br.com.sguc.entidade.Usuario;
import br.com.sguc.interfaces.CampeonatoRemote;
import br.com.sguc.interfaces.ModalidadeRemote;
import br.com.sguc.viewHelper.PartidaView;
import br.com.sguc.viewHelper.PontuacaoView;

@ManagedBean(name = "viewBean")
@ViewScoped
public class ViewCampeonatoBean implements Serializable {

	private static final long serialVersionUID = 1L;

	@EJB
	CampeonatoRemote campeonatoBean;

	@EJB
	ModalidadeRemote modalidadeBean;

	private Campeonato campeonatoView;
	private Campeonato campeonato;
	private List<PartidaView> partida;
	private PartidaView partidaView = null;
	private List<PontuacaoView> equipes;
	private int totalPartidasCampeonato = 0;
	private int totalPartidasRealizadasCampeonato = 0;
	private PontuacaoView primeiro = new PontuacaoView();
	private PontuacaoView segundo = new PontuacaoView();
	

	
	public DecimalFormat df = new DecimalFormat("0.00"); 
	/**
	 * Contrutor
	 */

	public ViewCampeonatoBean() {

		if (!FacesContext.getCurrentInstance().getExternalContext()
				.getSessionMap().isEmpty()) {
			campeonatoView = (Campeonato) FacesContext.getCurrentInstance()
					.getExternalContext().getSessionMap().get("camper");
		}
		if (campeonatoView == null) {
			campeonatoView = new Campeonato();
		} else {
			campeonato = campeonatoView;
		}

		montarObjetoDeTela();
		calculaPontos();
		// campeonato fechado
		if (campeonato.getStatus().equals("2")) {
			defineVencedores();
		}
	}

	/**
	 * Methods
	 */

	public void defineVencedores(){
	
		for (PontuacaoView view : equipes) {
			PontuacaoView scape;
			if(primeiro == null){
				primeiro = view;
			}
			
			if(primeiro.getPontuacao() < view.getPontuacao()){
				scape = primeiro;
				primeiro = view;
				
				if(segundo == null){
					segundo = scape;
				}
				else if(segundo.getPontuacao() < scape.getPontuacao()){
					segundo = scape;
				}
			}
			else if (segundo.getPontuacao() < view.getPontuacao()){
				segundo = view;
			}
		}
	}
	
	public void calculaPontos(){
		
		equipes = new ArrayList<>();
		
		for (Equipe equipe : campeonato.getEquipe()) {
			PontuacaoView view = new PontuacaoView();
			view.setEquipe(equipe);
			equipes.add(view);
		}
		
		for (PontuacaoView pontuacaoView : equipes) {
			
			int totalPartidas = 0,	
				totalPartidasRealizadas = 0,
				totalPontosPro = 0,
				totalPontosContra = 0,
				totalGanhas = 0,
				totalPerdidas = 0,
				totalEmpates = 0,
				pontuacao = 0,
				desempenho = 0;
			
			double aproveitamento = 0.00d,
				  average = 0.00d;
			
			for (Partida partida : campeonato.getPartida()) {
				
				totalPartidasCampeonato++;
				
				if(partida.getStatus().equals("F")){
					totalPartidasRealizadasCampeonato ++;
				}
				
				if(pontuacaoView.getEquipe().getIdEquipe().equals(partida.getEquipe1()) || pontuacaoView.getEquipe().getIdEquipe().equals(partida.getEquipe2())){
					totalPartidas ++;
					
					if(partida.getStatus().equals("F")){
						totalPartidasRealizadas ++;
						
						if(pontuacaoView.getEquipe().getIdEquipe().equals(partida.getEquipe1())){
							totalPontosContra += partida.getResultado2();
							totalPontosPro += partida.getResultado1();
							
							if((int)partida.getResultado1() > (int)partida.getResultado2()){
								totalGanhas++;
								
								if(campeonato.getTipoPontuacao().equals("3-1-0")){
									pontuacao +=3;
								}
								else if(campeonato.getTipoPontuacao().equals("1-0")){
									pontuacao++;
								}
							}
							else if((int)partida.getResultado1() < (int)partida.getResultado2()){
								totalPerdidas++;
							}
							else {
								totalEmpates++;

								if(campeonato.getTipoPontuacao().equals("3-1-0")){
									pontuacao +=1;
								}
							}
							
						}
						if(pontuacaoView.getEquipe().getIdEquipe().equals(partida.getEquipe2())){
							totalPontosContra += partida.getResultado1();
							totalPontosPro += partida.getResultado2();
							
							if((int)partida.getResultado2() > (int)partida.getResultado1()){
								totalGanhas++;
								
								if(campeonato.getTipoPontuacao().equals("3-1-0")){
									pontuacao +=3;
								}
								else if(campeonato.getTipoPontuacao().equals("1-0")){
									pontuacao++;
								}
							}
							else if((int)partida.getResultado2() < (int)partida.getResultado1()){
								totalPerdidas++;
							}
							else {
								totalEmpates++;
								
								if(campeonato.getTipoPontuacao().equals("3-1-0")){
									pontuacao +=1;
								}
							}
						}
						
						
					}
				}
			}
			pontuacaoView.setTotalEmpates(totalEmpates);
			pontuacaoView.setTotalGanhas(totalGanhas);
			pontuacaoView.setTotalPartidas(totalPartidas);
			pontuacaoView.setTotalPartidasRealizadas(totalPartidasRealizadas);
			pontuacaoView.setTotalPerdidas(totalPerdidas);
			pontuacaoView.setTotalPontosContra(totalPontosContra);
			pontuacaoView.setTotalPontosPro(totalPontosPro);
			pontuacaoView.setPontuacao(pontuacao);

//			AVERAGE
			if(totalPontosContra!=0){
				String av = df.format((float)totalPontosPro/(float)totalPontosContra);
				pontuacaoView.setAverage1(av);
				pontuacaoView.setAverage((double)(totalPontosPro/totalPontosContra));
			}else {
				
				pontuacaoView.setAverage1(df.format((float)totalPontosPro));
				pontuacaoView.setAverage((double)totalPontosPro);
			}
			
//			TODO reavaliar formula Aproveitamento
			if(campeonato.getTipoCampeonato().equals("1")){
				if(totalPartidasRealizadas != 0){
					String ap = (df.format(((float)pontuacao/((float)totalPartidasRealizadas*3.0))*100));
					pontuacaoView.setAproveitamento1(ap);
//					pontuacaoView.setAproveitamento1((((pontuacao/totalPartidasRealizadas)*3)*100));
				}
				else {
					pontuacaoView.setAproveitamento1(df.format(0.00f));
				}
			}
			else {
				if(totalPartidasRealizadas!= 0){
					String ap = (df.format(((float)pontuacao/((float)totalPartidasRealizadas*1.0))*100));
					pontuacaoView.setAproveitamento1(ap);
//					pontuacaoView.setAproveitamento1(((pontuacao/totalPartidasRealizadas)*1)*100));
				}
				else {
					pontuacaoView.setAproveitamento1(df.format(0.00f));
				}
			}

		}
		if(equipes.size()!=0){
			totalPartidasCampeonato = totalPartidasCampeonato / equipes.size();
			totalPartidasRealizadasCampeonato = totalPartidasRealizadasCampeonato / equipes.size();
		}
		else{
			totalPartidasCampeonato =0;
			totalPartidasRealizadasCampeonato = 0;
		}
	}
	

	public String redirecionar() {

		FacesContext fc = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fc.getExternalContext().getSession(
				false);
		session.invalidate();

		return "index.jsf";
	}

	public void montarObjetoDeTela() {

		this.partida = new ArrayList<>();

		for (Partida partida : campeonato.getPartida()) {

			PartidaView partidaView = new PartidaView();
			partidaView.setCampeonatoEquipe(campeonato);
			partidaView.setDataPartida(partida.getDataPartida());
			for (Equipe equipe : campeonato.getEquipe()) {
				if (partida.getEquipe1().equals(equipe.getIdEquipe())) {
					partidaView.setEquipe1(equipe);
				} else if (partida.getEquipe2().equals(equipe.getIdEquipe())) {
					partidaView.setEquipe2(equipe);
				}
			}
			partidaView.setHorario(partida.getHorario());
			partidaView.setIdPartida(partida.getIdPartida());
			partidaView.setIndentificacaoArbitro(partida
					.getIndentificacaoArbitro());
			partidaView.setLocal(partida.getLocal() == null ? new Localizacao()
					: partida.getLocal());
			partidaView.setNomeArbitro(partida.getNomeArbitro());
			partidaView.setResultado1(partida.getResultado1());
			partidaView.setResultado2(partida.getResultado2());
			partidaView.setRodada(partida.getRodada());
			partidaView.setStatus(partida.getStatus());
			if (partida.getStatus().equals("A")) {
				partidaView.setStatus("Aberto");
			} else if (partida.getStatus().equals("F")) {
				partidaView.setStatus("Fechada");
			}
			this.partida.add(partidaView);

		}
	}

	/**
	 * Getters and Setters
	 */

	public Campeonato getCampeonato() {
		if (campeonato == null) {
			this.campeonato = new Campeonato();
		}
		return campeonato;
	}

	public void setCampeonato(Campeonato campeonato) {
		this.campeonato = campeonato;
	}

	public Campeonato getCampeonatoView() {
		return campeonatoView;
	}

	public void setCampeonatoView(Campeonato campeonatoView) {
		this.campeonatoView = campeonatoView;
	}

	public List<PartidaView> getPartida() {
		return partida;
	}

	public void setPartida(List<PartidaView> partida) {
		this.partida = partida;
	}

	public PartidaView getPartidaView() {
		return partidaView;
	}

	public void setPartidaView(PartidaView partidaView) {
		this.partidaView = partidaView;
	}

	public List<PontuacaoView> getEquipes() {
		return equipes;
	}

	public void setEquipes(List<PontuacaoView> equipes) {
		this.equipes = equipes;
	}

	public int getTotalPartidasCampeonato() {
		return totalPartidasCampeonato;
	}

	public void setTotalPartidasCampeonato(int totalPartidasCampeonato) {
		this.totalPartidasCampeonato = totalPartidasCampeonato;
	}

	public int getTotalPartidasRealizadasCampeonato() {
		return totalPartidasRealizadasCampeonato;
	}

	public void setTotalPartidasRealizadasCampeonato(
			int totalPartidasRealizadasCampeonato) {
		this.totalPartidasRealizadasCampeonato = totalPartidasRealizadasCampeonato;
	}

	public PontuacaoView getPrimeiro() {
		return primeiro;
	}

	public void setPrimeiro(PontuacaoView primeiro) {
		this.primeiro = primeiro;
	}

	public PontuacaoView getSegundo() {
		return segundo;
	}

	public void setSegundo(PontuacaoView segundo) {
		this.segundo = segundo;
	}
	
}
